/**************************************************************************************
 * Copyright (C) 2008 EsperTech, Inc. All rights reserved.                            *
 * http://esper.codehaus.org                                                          *
 * http://www.espertech.com                                                           *
 * ---------------------------------------------------------------------------------- *
 * The software in this package is published under the terms of the GPL license       *
 * a copy of which has been included with this distribution in the license.txt file.  *
 **************************************************************************************/
package com.espertech.esper.filter;

import com.espertech.esper.client.EventBean;
import com.espertech.esper.epl.expression.ExprEvaluatorContext;
import com.espertech.esper.epl.expression.ExprNode;
import com.espertech.esper.epl.variable.VariableService;

/**
 * Adapter for use by {@link FilterParamIndexBooleanExpr} to evaluate boolean expressions, providing
 * events per stream to expression nodes. Generated by @{link FilterSpecParamExprNode} for
 * boolean expression filter parameters.
 */
public class ExprNodeAdapterMultiStream extends ExprNodeAdapterBaseVariables
{
    protected final EventBean[] prototypeArray;
    private final ThreadLocal<EventBean[]> arrayPerThread;

    public ExprNodeAdapterMultiStream(String statementName, ExprNode exprNode, ExprEvaluatorContext evaluatorContext, VariableService variableService, EventBean[] prototype) {
        super(statementName, exprNode, evaluatorContext, variableService);
        this.prototypeArray = prototype;

        arrayPerThread = new ThreadLocal<EventBean[]>()
        {
            protected synchronized EventBean[] initialValue()
            {
                EventBean[] eventsPerStream = new EventBean[prototypeArray.length];
                System.arraycopy(prototypeArray, 0, eventsPerStream, 0, prototypeArray.length);
                return eventsPerStream;
            }
        };
    }

    @Override
    public boolean evaluate(EventBean theEvent)
    {
        if (variableService != null)
        {
            variableService.setLocalVersion();
        }
        EventBean[] eventsPerStream = arrayPerThread.get();
        eventsPerStream[0] = theEvent;
        return evaluatePerStream(eventsPerStream);
    }
}
